/*************************************************************************
	> File Name: P1239.cpp
	> Author: yufangze
	> Mail: 2224590123@qq.com
	> Created Time: 2025-04-09 13:53:26
 ************************************************************************/

#include <iostream>
#include <set>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

//取数字n的[l, r]之间的数
//23456
//k...1
int get(int *num, int l, int r) {
    int ans = 0;
    for (int i = l; i >= r; i--) {
        ans = ans * 10 + num[i];
    }
    return ans;
}
//求10的次方
int p(int n) {
    int ans = 1;
    while (n--) ans *= 10;
    return ans;
}

//求0~n中数字x出现的次数
int dp(int n, int x) {
    if (n == 0) return 0;
    int num[20], k = 0;
    while (n) {
        num[++k] = n % 10;
        n /= 10;
    }
    int ans = 0;
    //计算x在每一位上的可能
    //如果x是0，x不可能出现在最高位，从k-1位开始循环
    for (int i = k - !x; i >= 1; i--) {
        //情况1：考虑了x是0的可能
        if (i != k) ans += (get(num, k, i + 1) - !x) * p(i - 1);
        //情况2：A
        if (x == num[i]) ans += get(num, i - 1, 1) + 1;
        //情况2：B
        else if (x < num[i]) ans += p(i - 1);
    }
    return ans;
}

int main() {
    int l = 1, r;
    cin >> r;
    for (int i = 0; i <= 9; i++) {
        cout << dp(r, i) - dp(l - 1, i) << endl;
    }
    return 0;
}
